package com.jinhongone.pattern.creater.singleton.demo8;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/*
* 上述声明单例模式除枚举方式外，反射方式会打破单例
* */
public class Test {

    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
//        获取Singleton字节码
        Class<Singleton> singletonClass = Singleton.class;
//        获得Singleton 默认构造函数
        Constructor<Singleton> declaredConstructor = singletonClass.getDeclaredConstructor();
//        由于构造函数是private，所以取消可见性（打破封装）
        declaredConstructor.setAccessible(true);

        Singleton i1 = declaredConstructor.newInstance();
//        通过在构造函数中判断是否已new对象的方式，阻止反射new多次对象
        Singleton i2 = declaredConstructor.newInstance();
//       反射获取构造函数，在new对象，得出不同的对象，打破了单例模式。
        System.out.println(i1 == i2);

    }
}
